package cn.itcast.mq.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class CommonConfig implements ApplicationContextAware {
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
        // 生产者确认的callback
//        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//            /**
//             * @param correlationData  自定义的数据   存储消息唯一ID
//             * @param ack  是否确认  true 消息已经被exchange   false 消息未成功发送到exchange
//             * @param cause 原因
//             */
//            @Override
//            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//                if(ack){
//                    log.info("消息ID：{}  已经成功发送到exchange中 ",correlationData.getId());
//                }else {
//                    log.error("消息ID：{}  发送到exchange失败， 原因:{} ",correlationData.getId(),cause);
//                }
//                // 设置定时重试的方案    10次   ==>  转给人工处理
//            }
//        });
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             * @param message 返还的消息
             * @param replyCode  返回的状态码
             * @param replyText  返还的文本内容
             * @param exchange   交换机
             * @param routingKey  路由
             */
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                 log.error("消息返还触发，  消息内容:{}  回复状态:{}  回复内容:{}  消息交换机:{}  消息路由:{}",
                         new String(message.getBody()),replyCode,replyText,exchange,routingKey
                         );
            }
        });
    }

    @Bean
    Queue simpleQueue(){
        return QueueBuilder.durable("simple.queue").build(); // 基于内存存储
    }

    @Bean
    Queue normalQueue(){
        return QueueBuilder.durable("normal.queue").build(); // 基于内存存储
    }
    @Bean
    Queue lazyQueue(){
        return QueueBuilder.durable("lazy.queue").lazy().build(); // 基于内存存储
    }
}
